/**
 * @file BookType.h
 * @author 严一涵 (yyhhenry@foxmail.com)
 * @brief 库存图书
 * @version 0.1
 * @date 2022-05-11
 *
 * @copyright Copyright (c) 2022
 *
 */
#ifndef BOOKTYPE_H_YYH
#define BOOKTYPE_H_YYH
#include <stdlib.h>
#include <string.h>
#include "./ListType.h"
#include "./StrFunc.h"
/**
 * @brief 库存图书
 * @author 严一涵
 */
typedef struct BookType
{
    /**
     * @brief 图书编号
     *
     */
    char *id;
    /**
     * @brief 图书名称
     *
     */
    char *title;
    /**
     * @brief 图书作者
     *
     */
    char *author;
    /**
     * @brief 出版社
     *
     */
    char *publisher;
    /**
     * @brief 出版时间
     *
     */
    char *publicationDate;
    /**
     * @brief 价格
     *
     */
    double price;
    /**
     * @brief 类别
     *
     */
    char *category;
    /**
     * @brief 总入库数量
     *
     */
    int totalQuantity;
    /**
     * @brief 当前库存数量
     * 当前借出数量为 (totalQuantity - currentQuantity)
     */
    int currentQuantity;
} BookType;

/**
 * @brief BookType构造
 * @author 严一涵
 * @param str CSV格式的一行字符串
 * @return BookType*
 */
BookType *BookType_BookType(const char *str);

/**
 * @brief 链表对BookType的支持
 */
BookType *BookType_ListNode(ListNode *p);

/**
 * @brief BookType转CSV格式字符串
 * @author 严一涵
 * @param book 借用所有权
 */
char *BookType_toCSVStr(BookType *book);

/**
 * @brief BookType销毁
 * @author 严一涵
 * @param book 所有权销毁，禁止外部使用
 */
void BookType_free(void *_book);

/**
 * @brief 通用查询
 * @author 严一涵
 */
int BookType_query(BookType *book, const char *pattern);

/**
 * @brief BookListType绑定一个文件的书籍链表
 * @author 严一涵
 */
typedef struct BookListType
{
    char *filename;
    ListType *list;
} BookListType;

const char *const BookSheetTitle;

/**
 * @brief 给定文件名并生成BookList，默认调用一次read
 * @author 严一涵
 * @param _filename 文件名
 */
BookListType *BookListType_BookListType(const char *_filename);

/**
 * @brief 从文件中更新内容
 * @author 严一涵
 */
void BookListType_read(BookListType *bookList);

/**
 * @brief 更新内容到文件中
 * @author 严一涵
 */
void BookListType_write(BookListType *bookList);

/**
 * @brief BookListType销毁
 * @author 严一涵
 * @param bookList 所有权销毁，禁止外部使用
 */
void BookListType_free(BookListType *bookList);

/**
 * @brief 通用查询
 * @author 严一涵
 * @return ListType* 返回引用型指针的链表
 */
ListType *BookListType_query(BookListType *bookList, const char *pattern);

/**
 * @brief 通用查询（还有库存的）
 * @author 严一涵
 * @return ListType* 返回引用型指针的链表
 */
ListType *BookListType_queryAvailable(BookListType *bookList, const char *pattern);

/**
 * @brief 严格id匹配查询
 * @author 严一涵
 * @return BookType* 返回数据库中引用型指针
 */
ListNode *BookListType_queryById(BookListType *bookList, const char *id);
#endif // BOOKTYPE_H_YYH
